iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 30
0
自我挑戰組

前端新手的學習筆記系列 第 30

Day30:每天一個小練習 - JS30-15-LocalStorage

  • 分享至 

  • xImage
  •  

參考資料:
Alex老師的教學
PJCHENder筆記
JS30-Day15-LocalStorage

toDoList


先抓節點

const addItems = document.querySelector('.add-items'); //form
const itemsList = document.querySelector('.plates'); // ul
const items = JSON.parse(localStorage.getItem('items')) || [];
// 取出localStorage的資料並由字串轉為物件
// items是localStorage內的資料夾名稱
// 這樣寫也可以
// items = localStorage.getItem('items') ? JSON.parse(localStorage.getItem('items')) : [];

作出畫面

let createList = (data = [], dom) => {
    // 針對容器做資料處理
    dom.innerHTML = data
        .map((item, index) => {
            //  <input type="checkbox" data-index="1" id="item1" checked} />
            return `
        <li>
            <input type="checkbox" data-index="${index}" id="item${index}" ${item.done ? 'checked' : ''} />
            <label for="item${index}">${item.text}</label>
        </li>
        `;
        })
        .join('');//字串化
};

createList(items, itemsList);
// (localStorage資料, ul位置)

輸入內容

let addItem = e => {
    e.preventDefault(); //擋住form表單的內建動作,否則會跳到action的連結
    let input = e.target.querySelector('[name=item]'); //輸入框
    // e.target 可以換成 this ,但this不建議用箭頭函式
    // 此處可以用this.querySelector('input:first-child')
    // name改的機率不高,建議用name

    let obj = { text: input.value, done: false }; //傳入的物件樣式
    items.push(obj); // 更新JS資料
    //和上方合併成items.push({ text, done: false });也OK

    localStorage.setItem('items', JSON.stringify(items)); // 更新localStorage資料

    e.target.reset(); //清空輸入框
    // 可以用this.reset();
    // reset()針對form表單

    createList(items, itemsList); //更新畫面
};
addItems.addEventListener('submit', addItem); //加入內容的按鈕
// 題目提供的節點是form表單,不是裡面的按鈕

紀錄li前方圖示的切換

let toggleItem = e => {
    //  console.log(e.currentTarget, e.target);
    if (!e.target.matches('input')) {
        //阻擋不是input的內容,避免重複觸發
        return;
    }
    let index = e.target.dataset.index;
    items[index].done = !items[index].done;//更新JS資料
    // 點擊時true變成false,反之亦然
    localStorage.setItem('items', JSON.stringify(items)); // 更新localStorage資料
    createList(items, itemsList); //更新畫面
};;
itemsList.addEventListener('click', toggleItem); //整個ul

預設的CSS有個很有趣的地方,點擊時會切換圖案,而且此圖案直接寫在CSS內。

.plates input + label:before {
  content: "⬜️";
  margin-right: 10px;
}

.plates input:checked + label:before {
  content: "?";
}

想要換圖案可以去EMOJIALL找找看是否有喜歡的


連結


上一篇
Day29:每天一個小練習 - JS30-14-JS Reference VS Copy
下一篇
Day31 - JS30 - 16 - Mouse Move Shadow
系列文
前端新手的學習筆記32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言